﻿using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.Linq.Expressions;

namespace est1
    
{
    enum E_Vocaloid
    {
        len,
        rin,
            
    }
    enum E_music
    {
        rock,
        elector,
        indie,
        
    }
    enum E_XBcoffee
    {
        medium,
        larage,
        Glarage,
    }
    enum E_QqTybe
    {
        onlone,
        offline,
        busy,
        sleep,
    }
    #region 知识点1 基本概念
    //1.枚举是什么
    //枚举是一个比较特别的存在
    //他是一个被命名的整型常量的集合
    //一般用她来表示状态、类型等等

    //2.申明枚举 和 申明枚举变量
    //注意：申明枚举 和 申明枚举变量是两个概念
    //申明枚举：相当于是创建一个自定义的枚举类型
    //申明枚举变量：使用申明的自定义枚举类型 创建一个枚举变量

    //3.申明，枚举语法
    //枚举名 以E和E_开头 作为我们的命名规范
    //  enum E_自定义枚举名
    //{
    //    自定义枚举名字,//枚举中包裹的整型变量 第一个默认值0 下面会依次累加
    //    自定义枚举名字1,
    //    自定义枚举名字2,
    //}
        enum E_自定义枚举名
    {
        自定义枚举名字=5,//第一个默认值是几 下面会依次从这个数开始累加
        自定义枚举名字1,//这是6
        自定义枚举名字2=100,
        自定义枚举名字3,//这是101
    }
    #endregion
    #region 知识点2 在哪里申明枚举
    //namespace语句块中（常用）
    //class语句块中，struct语句块中
    //注意：枚举不能在函数语句块中申明！！（但可以在函数中使用）

    enum E_MosterType
    {
        Normal,//默认为0
        Bpss,//1
    }

    enum E_PlayerType
    {
        Main,
        Other,
    }
    #endregion
    internal class class1
    {
        static void Main(string[] args)
        {
            Console.WriteLine("枚举");
            #region 知识点3 枚举的使用
            //申明枚举类型  变量名=默认值；（自定义的枚举类型，枚举项）
            E_PlayerType PlayerType=E_PlayerType.Main;
            if(PlayerType==E_PlayerType.Main)//用枚举可以清楚的读懂什么意思
            {
                Console.WriteLine("主玩家逻辑");
            }
            else if(PlayerType==E_PlayerType.Other)
            {
                Console.WriteLine("其他玩家逻辑");
            }

            E_MosterType mosterType =E_MosterType.Bpss;
            //枚举就是和条件分支语句配合使用的，和switch绝配
            switch (mosterType)//按回车直接补全
            {
                //小怪与boss处理逻辑相同时，可以贯穿
                case E_MosterType.Normal:
                    Console.WriteLine("小怪逻辑");
                    break;
                case E_MosterType.Bpss:
                    Console.WriteLine("boss逻辑");
                    break;
                default:
                    break;
            }
            #endregion
            #region 知识点4 枚举的类型转换
            //1.int和枚举互转
            //可以括号强转
            int i=(int)PlayerType;
            Console.WriteLine(i);
            //int转枚举（直接赋值）
            PlayerType = 0;

            //枚举和string相互转化
            string str=PlayerType.ToString();//是把枚举名转成string
            Console.WriteLine(str);//打印结果是Main
            //把string转成枚举
            //parse后第一个参数的意思：你要转换的是哪个枚举类型  第二个参数：用于转换对应枚举项的字符串
            //转换完毕后 是一个通用类型 我们需要用括号强转成我们需要的目标枚举类型
            PlayerType=(E_PlayerType)Enum.Parse(typeof(E_PlayerType),"Other");//现在死记硬背，后面会讲到

            #endregion
            #region 知识点5 枚举的作用
            //在游戏开发中，对象很多时候会有许多状态
            //比如玩家 有一个动作状态 我们需要一个变量或者标识来表示当前玩家处于的是那种状态
            //综合考虑 可能会用int来表示它的状态
            //1 行走、2 待机、3 跑步、4 跳跃。。  等等

            //，枚举可以帮助我们 清晰的分清楚状态的含义
            #endregion

            //作业
            //1.定义QQ状态的枚举，并提示用户选择一个在线状态，我们接受输入的数字，并将其转换成枚举类型 
            Console.WriteLine("请选择状态：0在线、1离线、2繁忙、3休息");
            try//防止用户输入错误信息还是加个try比较好
            {
                int tybe=int.Parse(Console.ReadLine());//string转int类型
                E_QqTybe QqTybe=(E_QqTybe)tybe;//string强转枚举
                Console.WriteLine(QqTybe);
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }

            //2.用户去星巴克买咖啡，分为中杯（35元），大杯（40元），超大杯（43元），
            //请用户选择要购买的类型，用户选择后，打印：您购买了xxx咖啡，花费了xx元
            //例如：你购买了中杯咖啡，花费了35元
            Console.WriteLine("请选择咖啡：0中杯（35元）、1大杯（40元）、2超大杯（43元）");
            try
            {
                int type2=int.Parse(Console.ReadLine());
                E_XBcoffee XBcoffee = (E_XBcoffee)type2; 
                switch(XBcoffee)
                {
                    case E_XBcoffee.medium:
                        Console.WriteLine("你购买了中杯咖啡，价格为35元");
                        break;
                    case E_XBcoffee.larage:
                        Console.WriteLine("你购买了大杯咖啡，价格为40元");
                        break;
                    case E_XBcoffee.Glarage:
                        Console.WriteLine("你购买了超大杯咖啡，价格为43元");
                        break;
                    default:
                        Console.WriteLine("请输入正确数字");
                        break;

                }

            }
            catch
            {
                Console.WriteLine("请输入数字！");
            }

            //3.请用户选择歌姬与歌曲类别，最后打印歌姬的基本属性（攻击力，防御力，技能）
           /* 歌姬：
                len（攻击力 + 50，防御力 + 100）
                rin（攻击力 + 150，防御力 + 20）
                 隐藏歌姬：teto→奇美拉（攻击力 + 300，防御力 + 200）  
              类别：
                摇滚（攻击力 + 20，防御力 + 100，技能：磕大头）
                电子（攻击力 + 120，防御力 + 30，技能：充满电）
                独立（攻击力 + 200，防御力 + 10，技能：满地跳）
                （奇美拉隐藏技能→法棍大硬直，攻击力+200，防御力+200）
 
              举例打印：你选择了“teto”，攻击力：500，防御力：400，职业技能：法棍大硬直*/
           Console.WriteLine("请选择歌姬：0 len、1 rin");//隐藏歌姬3teto
            try
            {
                int b = int.Parse(Console.ReadLine());
                E_Vocaloid Vocaloid = (E_Vocaloid)b;
                string str2 = "";
                int atk = 0, def = 0;
                switch (Vocaloid)
                {
                    case E_Vocaloid.len:
                        str2 = "len";
                        atk += 50; def += 100;

                        break;
                    case E_Vocaloid.rin:
                        str2 = "rin";
                        atk += 100; def += 50;
                        break;
                }
                if (b == 3)
                {
                    Console.WriteLine("您选择的是奇美拉teto，攻击力为500，防御力为400，职业技能为法棍大硬直");
                }
                else
                {
                    Console.WriteLine("请输入歌曲类别：1摇滚、2电子、3独立");
                    E_music music = (E_music)int.Parse(Console.ReadLine());//合并写法
                    string str3 = "";
                    switch (music)
                    {
                        case E_music.rock:
                            atk += 20; def += 100;
                            str3 = "磕大头";
                            break;
                        case E_music.elector:
                            atk += 50; def += 30;
                            str3 = "充满电";
                            break;
                        case E_music.indie:
                            atk += 200; def += 10;
                            str3 = "满地跳";
                            break;
                    }
                    Console.WriteLine("您选择的是{0}，攻击力为{1}，防御力为{2}，职业技能为{3}", str2, atk, def, str3);
                }
            }
            catch
            {
                Console.WriteLine("请输入正确信息！");
            }
            
        }
    }
}
